package bll

import (
	"context"
	"gorm.io/gorm/utils"
	"manager/event"
	"manager/model"
	"manager/model/entity"
	"manager/store/postgres"
	"manager/store/redis"
	"time"
)

const (
	RedisKeyFaultType      = "fault_type"
	RedisKeyFirstFaultType = "first_fault_type"
)

var CacheFaultType = &cacheFaultType{}

// cacheFaultType 缓存故障类型
type cacheFaultType struct {
}

func (c *cacheFaultType) init() func() {
	return func() {}
}

func (c *cacheFaultType) onEvent(data *event.Data) {}

// GetFaultType 获取故障类型
func (c *cacheFaultType) GetFaultType(faultId int64) (info *entity.FaultType, err error) {
	// 从缓存中获取车辆类型
	info = &entity.FaultType{}
	redis.KV.GetValue(context.Background(), RedisKeyFaultType, utils.ToString(faultId), info)
	if info.Id > 0 {
		return
	}

	// 获取告警类型
	info, err = postgres.FaultType.Find(context.Background(), &model.FaultTypeInfoRequest{Id: faultId})
	if err != nil {
		return
	}

	// 设置缓存
	redis.KV.AddValueWithExpireTime(context.Background(), RedisKeyFaultType, utils.ToString(faultId), info, time.Second*600)
	return
}

// DeleteCache 删除缓存
func (c *cacheFaultType) DeleteCache(faultId int64) (err error) {
	return redis.KV.DelValue(context.Background(), RedisKeyFaultType, utils.ToString(faultId))
}

// GetFirstFaultType 获取一级故障类型
func (c *cacheFaultType) GetFirstFaultType(id int64) (info *entity.FirstFaultType, err error) {
	// 从缓存中获取车辆类型
	info = &entity.FirstFaultType{}
	redis.KV.GetValue(context.Background(), RedisKeyFaultType, utils.ToString(id), info)
	if info.Id > 0 {
		return
	}

	// 获取一级故障类型
	info, err = postgres.FirstFaultType.Find(context.Background(), &model.FirstFaultTypeInfoRequest{Id: id})
	if err != nil {
		return
	}

	// 设置缓存
	redis.KV.AddValueWithExpireTime(context.Background(), RedisKeyFaultType, utils.ToString(id), info, time.Second*600)
	return
}

// DeleteFirstFaultType 删除缓存
func (c *cacheFaultType) DeleteFirstFaultType(id int64) (err error) {
	return redis.KV.DelValue(context.Background(), RedisKeyFirstFaultType, utils.ToString(id))
}
